#include "ASRModule.h"

// 实现带HardwareSerial引用的构造函数
ASRModule::ASRModule(HardwareSerial &uart) : _uart(&uart) {}
// ASRModule.cpp的begin()函数
void ASRModule::begin(uint32_t baud) {
    if (_uart == nullptr) {
        Serial.println("ERROR: UART未初始化");
        return;
    }
    // 不指定引脚，使用main.cpp的配置
    _uart->begin(baud, SERIAL_8N1); 
}

void ASRModule::loop() {
    while (_uart->available()) {
        uint8_t byte = _uart->read();
        // 调试输出可能导致干扰，建议移至特定条件触发
        // Serial.printf("RX: 0x%02X ", byte); 

        if (!_frameStart) {
            if (byte == 0xAA) {
                _rxIndex = 0;
                _rxBuffer[_rxIndex++] = byte;
                _frameStart = true;
            }
        } else {
            _rxBuffer[_rxIndex++] = byte;

            if (_rxIndex == 5) { // 检查5字节帧
                if (_rxBuffer[0] == 0xAA && _rxBuffer[1] == 0x55 &&
                    _rxBuffer[3] == 0x55 && _rxBuffer[4] == 0xAA) {
                    processFrame(_rxBuffer, _rxIndex);
                }
                _frameStart = false;
                _rxIndex = 0;
            }
        }
    }
}

void ASRModule::processFrame(uint8_t* frame, size_t length) {
    if (length == 5 && frame[0] == 0xAA && frame[1] == 0x55) {
        uint8_t commandCode = frame[2]; // 命令码（如0x03）
        String command = "";
        switch (commandCode) {
            case 0x01:
                command = "丁真"; // snid=1的ASRTO
                break;
            case 0x02:
                command = "牢大"; // snid=2的ASRTO
                break;
            case 0x03:
                command = "请说。"; // snid=3的ASRTO
                break;
            case 0x04:
                command = "九歌"; // snid=4的ASRTO
                break;
            default:
                break;
        }
        if (!_callback) return;
        _callback(command);
    }
}

void ASRModule::setCommandCallback(void (*callback)(const String&)) {
    _callback = callback;
}